/*
 * author: Andriamananony, Meß, Falk
 */

package plan;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

import util.Interval;
import auftrag.Operation;

public class Plan {
	private ArrayList<Belegung> mBelegungen = new ArrayList<Belegung>();
	private HashMap<Operation, Interval> mPlannedOperations = new HashMap<Operation, Interval>();
	
	/**
	 * Fügt dem Plan eine neue Belegung hinzu
	 * @param b Belegung, die hinzugefügt werden soll
	 * @return true, falls die Belegung erfolgreich hinzugefügt werden konnte
	 */
	public boolean addBelegung(Belegung b){
		//Hat die Operation einen Vorgänger? Dieser muss zuerst verplant werden
		if(b.getOperation().getPreviousOperation() != null && !mPlannedOperations.containsKey(b.getOperation().getPreviousOperation()))
			return false;
		
		if(b.getResource().isOccupied(b.getInterval()))
			return false;

		mPlannedOperations.put(b.getOperation(), b.getInterval());
		mBelegungen.add(b);
		b.getOperation().setIntervall(b.getInterval());
		b.getResource().addInterval(b.getInterval());
		Collections.sort(mBelegungen);
		
		return true;
	}
	
	public void print(){
		for(Belegung b: mBelegungen){
			System.out.println(b.getResource()+" - ("+b.getInterval()+") - "+b.getOperation());
		}
	}
	
	public boolean isPlanned(Operation o){
		if(o!= null && mPlannedOperations.containsKey(o))
			return true;
		return false;
	}
	
	public ArrayList<Operation> getOperations(){
		ArrayList<Operation> tmp = new ArrayList<Operation>();
		tmp.addAll(mPlannedOperations.keySet());
		return tmp;
	}
	
	public ArrayList<Belegung> getBelegungen(){
		return mBelegungen;
	}
	
	public int getEndDate(){
		int max = 0;
		for(Belegung b:mBelegungen)
			if(b.getInterval().getEnd() > max)
				max = b.getInterval().getEnd();
		return max;
	}
}
